/**
 * @file anaylise_config_file.c
 * @author Linquan  
 * @brief   解析配置文件的回调函数
 *          
 * @version 1.0
 * @date 2024-08-30
 * 
 * @copyright Copyright (c) 2024
 * @note  当前只包含了解析 设备下接设备的配置文件的回调函数，后期还会有 解析 配置联动公式的配置文件等的回调函数
 */

#include <stdio.h>


#include "config_file_analyse_callback.h"
#include "config_struct.h"
#include "csvlib.h"


/**
 * 配置文件.csv格式、
 * 行号
 * 1    配置文件名称
 * 2    回路数量            数量
 * 3   配置文件表头信息
 * 4  回路名称注释        回路1—ID  回路中节点数量
 * 5  回路名称注释       回路2-ID  回路中节点数量
 *    ……                  ……          ……
 * 
 * n+5  回路号  回路索引号  设备类型,设备描述,配置参数1,配置参数2,配置参数3...配置参数8
 * n+6  具体的每个节点的信息
 * 
 * NOTE: 回路id、回路节点索引号在配置文件中均从1开始。
 */

#define ID(X)        (X-1) 
#define INDEX(X)     (X-1)


/**
 * @brief Get the circuit number object
 *        获得配置节点中的 全部回路的数量
 * 
 * @param index 
 * @param token 
 * @param data_return :void*,请根据具体类型进行转换，注意内外类型要一致，否则运行报错。
 * @return int 
 */
int get_circuit_number(int index, char  *token,void *data_return)
{
       int res = -1;
       size_t *data = (size_t*)data_return;

       if(index >= CFG_PARA_MAX +4 || index < 1)
       {
              return res;
       }
       
       switch (index)
       {
              // 因为第一列作为中文注释，不参与解析。所以从第二列开始解析
              case 2:     
                     debug_log("表头：回路总数量：%d\n",atoi(token));
                     *data =  atoi(token);
              break;

              default:
                     //debug_log("get number Token:%d, %s\n", index, token);
              break;
       }


}            



/**
 * @brief 解析配置文件中的表头信息，得到回路ID号和回路中节点数量。并传给节点树，进行节点空间分配
 *          可用于：90A、91A、中继？
 *  （中继考虑用字符串形式配置进去，解析字符串得到 节点号和数量，这里要设置中继模块所支持的最大数量）
 * @param index 
 * @param token 
 * @return int SUCESS = 0, FAILE = -1
 */
int creat_one_node_tree(int index, char  *token, void* data_return)
{
       int res = -1;
       cfg_circuit_overview_t *table_head = (cfg_circuit_overview_t*)data_return;

       if(index >= CFG_PARA_MAX +4 || index < 1)
       {
              return res;
       }
   
       switch (index)
       {
              // 因为第一列作为中文注释，不参与解析。所以从第二列开始解析
              case 2:
                     table_head->circuit_ID = ID(atoi(token));
                     //debug_log("表头：回路号：%d\n",table_head->circuit_ID);
              break;

              case 3:
                     table_head->circuit_node_num = atoi(token);
                     //debug_log("表头：回路节点数量：%d\n", table_head->circuit_node_num);
              break;

              default:
                     //debug_log("Token:%d, %s\n", index, token);
              break;
       }
       
}


/**
 * @brief 解析具体节点格式，并把解析出的数据传给节点树，对节点进行初始化。
 * 
 * @param index 
 * @param token 
 * @return int sucess = 0, fail = -1
 */
int  analyse_node_info(int index, char  *token, void* data_return)
{
       int res = -1;
       cfg_node_info_t *config_info = (cfg_node_info_t*)data_return;
        int index_offset = 0;
       if(index >= CFG_PARA_MAX +4 || index < 1)
       {
              return res;
       }

       switch (index)
       {
              case 1:
                     config_info->dev_addr.circuit_ID = ID(atoi(token));
                     //debug_log("回路号：%d\n",config_info->dev_addr.circuit_ID);
              break;

              case 2:
                     config_info->dev_addr.circuit_node_index = INDEX(atoi(token));
                     //debug_log("设备索引号：%d\n",config_info->dev_addr.circuit_node_index);
              break;

              case 3:
                     sscanf(token, "%d",&config_info->node_type);
                     //debug_log("设备类型：%x\n",config_info->node_type);
              break;

              case 4:               
                     config_info->dev_description = token;

                     //debug_log("设备描述: %s\n",  config_info->dev_description);
              break;

              default:
                    
                     index_offset = index - 5;
                     config_info->config_para[index_offset] = token;

                     //debug_log("配置参数%d: %s\n",  (index_offset+1), config_info->config_para[index_offset] );
              break;
              
       }
       
      return res;
}












